using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//继承自LuaBehaviour，用于提供基于lua脚本的UI的相关通用逻辑
//用于与UI资源绑定后与其lua逻辑绑定
//相比原始LuaBehaviour，多了打开和关闭方法，因此要重写初始化和清除

//对于ui按钮的监听，因为ui可能在更新中修改。因此如果在c#中为ui按钮添加监听，并手动释放，不满足热更要求，因此具体的ui逻辑要写在lua中
//但是此时对于委托的释放就成了问题，因此需要在c#为相关操作手动扩展函数:
//1.避免OnOpen在反复开关中，对于事件的重复添加；
//2.避免在退出程序时，lua方法的释放问题——使用luaFunction作为参数接受lua方法，然后在c#中封装成匿名函数并添加委托，由c#的gc来释放
public class UILogic : LuaBehaviour
{
    public string AssetName;
    Action m_LuaOnOpen;
    Action m_LuaOnClose;

    //模拟awake的特性
    public override void Init(string luaName)
    {
        base.Init(luaName);
        //只有ui具有打开和关闭的方法，而luabehaviour是所有调用lua的脚本的基类（角色模型，场景等其他资源的逻辑就不能叫open或close），所以要写在ui里面
        m_ScriptEnv.Get("OnOpen", out m_LuaOnOpen);
        m_ScriptEnv.Get("OnClose", out m_LuaOnClose);
    }
    //模拟start的特性
    public void OnOpen()
    {
        m_LuaOnOpen?.Invoke();
    }

    public void Close()
    {
        m_LuaOnClose?.Invoke();
        //关闭的时候放入对象池
        Manager.Pool.UnSpawn("UI", AssetName, this.gameObject);
    }

    protected override void Clear()
    {
        m_LuaOnClose = null;
        m_LuaOnOpen = null;
        //先调用基类的clear
        base.Clear();
    }
}
